import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'
// 创建一个字定的axios方法(比原来的axios多了一个基地址)
// axios函数请求的 url地址前面会被拼接基地址 然后axios请求baseURL+url后台完整地址
export const baseURL = 'http://big-event-vue-api-t.itheima.net'
const myAxios = axios.create({
  baseURL
})
// 定义请求拦截器
myAxios.interceptors.request.use(
  function (config) {
    // 在请求前会触发一次
    // console.log(config)
    // 在发起时 同意携带请求头Authorization 和token值
    // 判断登录页面和注册页面 vuex里没有token 而且登录注册接口也不需要携带token(其他页面需要)
    if (store.state.token) {
      config.headers.Authorization = store.state.token
    }
    // 它返回给axios内源码 config配置对象(要请求后台的参数都在这个对象上)
    return config
  },
  function (error) {
    // 请求发起前的代码 如果有异常报错 会直接进入这里
    // 返回一个拒绝状态的Promise对象(axios留在原地的Promise对象状态就位失败结果为error变量值)
    // 口诀：return 非Promise对象值 回座位成功的结果 返回给下一个Promise对象(axios留在原地)
    // 口诀： return Promise对象 这个Promise对象状态 返回给下一个Promise对象
    // Promise.reject() 原地留下一个新的Promise对象(状态为失败) 它是Promise的类方法reject()
    return Promise.reject(error)
    // 等同于 return new Promise((resolve, reject) => { reject(error) })
  }
)
// 定义响应拦截器
myAxios.interceptors.response.use(
  function (response) {
    // 响应http 状态码为 2xx 时 触发成功的回调
    // 形参中的 response 是成功的结果
    // return 到 axios 原地Promise 对象 作为成功的结果
    return response
  }, function (error) {
    // 响应状态码不是 2xx 时触发失败的回调
    // 形参中的 error 是 失败的结果
    // return 到axios 原地 Promise对象位置 作为失败拒绝的状态
    // (如果那边使用了 try + catch 或者catch函数捕获 可以捕获到我们传递获取的error变量的值)
    if (error.response.status === 401) {
      // 本次响应的是token 过期了
      // 清楚vuex 里的一切 然后切换回到登录页面(被动退出)
      store.commit('updateToken', '')
      store.commit('updateUserInfo', {})
      Message.error('用户身份已过期!')
      router.push('/login')
    }
    return Promise.reject(error)
  }
)
// 导出自定义函数
export default myAxios
